/* ======================================================= */
/**
 * File   : GraphicObject.java
 * Date   : 2 mars 2010 at 23:31:47
 */
/* ======================================================= */
package fr.isima.isipaint.model;

import java.awt.Color;
import java.awt.Graphics2D;
import java.util.Observable;

import javax.swing.JPanel;

/* ======================================================= */
/**
 * 
 * @author Daniel
 * 
 *         A Graphic object represent, an abstract object to display on the
 *         scene
 * 
 */
/* ======================================================= */
public abstract class GraphicObject extends Observable implements Comparable<GraphicObject> {

	public static int CPT_ZORDER = 0;

	/** The bounding box of this object */
	protected JPanel selection;

	/** The x coordinate */
	protected int x;

	/** The y coordinate */
	protected int y;

	/** The z-order */
	protected int zOrder;

	/** The color, the default color is black */
	protected Color color = Color.BLACK;

	/** The object is filled */
	protected boolean fill = false;

	/* ======================================================= */
	/**
	 * Default Constructor
	 */
	/* ======================================================= */
	protected GraphicObject() {
	}

	/* ======================================================= */
	/**
	 * @param x the x coordinate
	 * @param y the y coordinate
	 */
	/* ======================================================= */
	protected GraphicObject(int x, int y) {
		setX(x);
		setY(y);
	}

	/* ======================================================= */
	/**
	 * @param x the x coordinate
	 * @param y the y coordinate
	 * @param color the color to draw
	 */
	/* ======================================================= */
	protected GraphicObject(int x, int y, Color color) {
		this(x, y);
		setColor(color);
	}

	/* ======================================================= */
	/**
	 * @param x the x coordinate
	 * @param y the y coordinate
	 * @param fill The object is it filled ?
	 */
	/* ======================================================= */
	public GraphicObject(int x, int y, boolean fill) {
		this(x, y);
		setFill(fill);
	}

	/* ======================================================= */
	/**
	 * @param x the x coordinate
	 * @param y the y coordinate
	 * @param color the color to draw
	 * @param fill The object is it filled ?
	 */
	/* ======================================================= */
	public GraphicObject(int x, int y, Color color, boolean fill) {
		this(x, y, color);
		setFill(fill);
	}

	/* ======================================================= */
	/**
	 * Get selection attribute
	 * 
	 * @return selection
	 */
	/* ======================================================= */
	public final JPanel getSelection() {
		return selection;
	}

	/* ======================================================= */
	/**
	 * Set selection with selection's value
	 * 
	 * @param selection
	 */
	/* ======================================================= */
	public final void setSelection(JPanel selection) {
		this.selection = selection;
	}

	/* ======================================================= */
	/**
	 * Get x attribute
	 * 
	 * @return x
	 */
	/* ======================================================= */
	public final int getX() {
		return x;
	}

	/* ======================================================= */
	/**
	 * Set x with x's value
	 * 
	 * @param x
	 */
	/* ======================================================= */
	public final void setX(int x) {
		this.x = x;
		setChanged();
		notifyObservers();
	}

	/* ======================================================= */
	/**
	 * Get y attribute
	 * 
	 * @return y
	 */
	/* ======================================================= */
	public final int getY() {
		return y;
	}

	/* ======================================================= */
	/**
	 * Set y with y's value
	 * 
	 * @param y
	 */
	/* ======================================================= */
	public final void setY(int y) {
		this.y = y;
		setChanged();
		notifyObservers();
	}

	/* ======================================================= */
	/**
	 * Get zOrder attribute
	 * 
	 * @return zOrder
	 */
	/* ======================================================= */
	public final int getzOrder() {
		return zOrder;
	}

	/* ======================================================= */
	/**
	 * Set zOrder with zOrder's value
	 * 
	 * @param zOrder
	 */
	/* ======================================================= */
	public final void setzOrder(int zOrder) {
		this.zOrder = zOrder;
		setChanged();
		notifyObservers();
	}

	/* ======================================================= */
	/**
	 * Get color attribute
	 * 
	 * @return color
	 */
	/* ======================================================= */
	public final Color getColor() {
		return color;
	}

	/* ======================================================= */
	/**
	 * Set color with color's value
	 * 
	 * @param color
	 */
	/* ======================================================= */
	public final void setColor(Color color) {
		this.color = color;
		setChanged();
		notifyObservers();
	}

	/* ======================================================= */
	/**
	 * Get fill attribute
	 * 
	 * @return fill
	 */
	/* ======================================================= */
	public final boolean isFill() {
		return fill;
	}

	/* ======================================================= */
	/**
	 * Set fill with fill's value
	 * 
	 * @param fill
	 */
	/* ======================================================= */
	public final void setFill(boolean fill) {
		this.fill = fill;
		setChanged();
		notifyObservers();
	}

	/** To draw a GraphicObject */
	public abstract void draw(Graphics2D g);

	/* ======================================================= */
	/**
	 * @see java.lang.Comparable#compareTo(java.lang.Object)
	 * Allows to sort a collection of graphic objects
	 */
	/* ======================================================= */
	@Override
	public int compareTo(GraphicObject o) {
		return this.zOrder - o.getzOrder();
	}

}
